import { initMixin } from './init'
import { stateMixin } from './state'
import { renderMixin } from './render'
import { eventsMixin } from './events'
import { lifecycleMixin } from './lifecycle'
import { warn } from '../util/index'

// Vue 构造函数本体
// 不使用 class 的目的是方便后续给 Vue 实例混入实例成员
// 核心是通过原型不断给 Vue 添加成员，使用 Class 与原型在语法上不搭配
function Vue (options) {
  if (process.env.NODE_ENV !== 'production' &&
    // 判断是否使用 new 来调用 Vue
    !(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword')
  }
  this._init(options)
}

// 在这里定义 init 方法
initMixin(Vue)
// 注册 $data/$props/$set/$delete/$watch
stateMixin(Vue)
// 注册 $on/$onece/$off/$emit
eventsMixin(Vue)
// _update/$forceUpdate/$destroy
lifecycleMixin(Vue)
// $nextTick/_render
renderMixin(Vue)

export default Vue
